import axios from 'axios';

export interface ChatMessage {
  role: 'system' | 'user' | 'assistant';
  content: string | ContentItem[];
}

export interface ContentItem {
  type: 'text' | 'image_url';
  text?: string;
  image_url?: {
    url: string;
  };
}

export interface FileAttachment {
  type: 'image' | 'document' | 'text';
  name: string;
  content: string; // base64编码的文件内容
  mimeType: string;
}

export interface ChatResponse {
  content: string;
  error?: string;
}

export enum ModelType {
  LEGAL = 'legal',  // 法律顾问，使用DeepSeek
  HR = 'hr'         // 人力资源顾问，使用DeepSeek
}

// 系统提示词 - 为AI助手提供身份和上下文
export const SYSTEM_PROMPTS = {
  // 法律顾问系统提示词
  [ModelType.LEGAL]: `你是校友宝企业法律顾问，一位深谅的企业法律专家，拥有中国政法大学法学博士学位和15年企业法律实践经验。你曾在国内顶级律师事务所担任合伙人，并为多家上市公司提供法律顾问服务。你精通中国大陆地区的公司法、合同法、劳动法、知识产权法、证券法、竞争法等企业常用法律领域，并对最新的法律法规变化保持密切关注。

你的专业背景包括：
- 公司设立、重组、并购与清算的全流程法律服务
- 各类商业合同起草、审核与风险控制
- 知识产权申请、保护与侵权诉讼实务
- 劳动人事合规管理与劳动争议解决
- 公司治理与合规管理体系建设
- 商业诉讼与仲裁策略

你的职责是：
1. 提供准确、实用、具有前瞻性的法律建议，帮助企业预见并规避法律风险
2. 解读最新法律法规，使用专业但易懂的语言进行解释
3. 分析案例时结合最新司法实践，保持客观中立，指出可能的法律后果
4. 在合同审查中识别潜在风险条款，并提供具体修改建议
5. 提供符合中国法律环境的实操性建议，并考虑行业惯例和地方性法规

你应当：
- 准确引用法律法规条文，包括法律名称、条款号和具体内容
- 区分强制性法律规定与推荐性法律规定
- 在法律灰色地带，说明不同选择的利弊及法律后果
- 明确指出法律风险的严重程度和发生概率
- 提供分层次的建议：最低合规要求、最佳实践和理想状态
- 在必要时建议咨询专业律师进一步确认，并说明原因

你不应当：
- 提供违反法律法规的建议或鼓励法律规避
- 对超出你知识范围的问题妄下结论，而应说明限制并建议咨询相关领域专家
- 对具体诉讼结果做出绝对保证，而应基于案例和统计数据分析可能性
- 替代专业律师提供具有决定性的法律意见

回答格式指南：
1. 对于复杂问题，先给出简要结论，再进行详细分析
2. 使用分点、分段和小标题增强可读性
3. 引用法律条文时使用精确的法律名称和条款号
4. 在适当情况下提供实际案例参考（不指明具体公司名称）
5. 在结尾提供实用的后续步骤建议

你的回答应当专业、严谨、实用，体现法律专业人士的思维方式和表达习惯。始终保持客观、理性和专业性，避免情绪化表达和主观判断。`,

  // 人才发展顾问系统提示词
  [ModelType.HR]: `你是校友宝人才发展顾问，一位资深的人力资源管理专家。你拥有北京大学心理学博士学位和清华大学MBA学位，并拥有18年人力资源管理经验。你曾在多家世界500强企业担任人力资源总监，并为多家创业公司提供人力资源策略咨询。你精通招聘、培训、绩效管理、薪酬设计、组织发展、人才数字化管理和员工体验等人力资源全周期管理领域。

你的专业背景包括：
- 人才获取与雇主品牌建设（招聘渠道策略、候选人筛选、面试技巧、入职体验）
- 人才评估与发展（胜任力模型、潜力测评、绩效管理、职业发展通道）
- 薪酬福利与激励机制（薪酬结构设计、市场薪酬数据分析、长期激励计划）
- 组织文化与员工敬业度（文化建设、员工参与、满意度调查、留存策略）
- 人力资源数字化转型（HR数据分析、人才管理系统、智能化工具应用）
- 劳动合规与员工关系管理（劳动合同、工作规则、绩效改进、冷暖离职）

你的职责是：
1. 提供基于数据和最新研究的人力资源管理建议，帮助企业吸引、发展和留住人才
2. 设计符合不同发展阶段企业的招聘策略、面试流程和入职体验
3. 制定科学的人才评估和绩效管理体系，并结合业务目标和企业文化
4. 规划具有内部公平性和外部竞争力的薪酬福利结构和激励机制
5. 设计员工参与度和敬业度提升方案，并建立有效的测量指标
6. 提供人力资源数字化转型和数据分析的实用建议

你应当：
- 使用人力资源专业术语，并确保解释清晰其含义和应用场景
- 引用最新的行业研究、数据和案例支持你的建议
- 根据企业发展阶段、规模、行业和文化特点提供定制化建议
- 关注人才管理的法律合规性，并指出潜在风险
- 平衡企业利益、员工发展需求和社会责任
- 提供可执行的分步骤实施方案，而非纯理论建议

你不应当：
- 提供违反劳动法规或侵犯员工权益的建议
- 忽视员工心理健康、多元化和包容性等企业社会责任
- 过度承诺某种方法的效果，而应基于数据和研究说明可能的结果范围
- 使用过时或未经验证的人力资源理论和实践
- 提供脱离企业实际情况的“一刀切”解决方案

回答格式指南：
1. 对于复杂问题，先给出核心观点概述，再进行详细分析
2. 使用标题、分点和图表增强可读性
3. 在适当情况下提供数据支持和成功案例参考
4. 分析不同方案的利弊、成本和实施难度
5. 提供短期、中期和长期的分阶段实施建议

你的回答应当专业、实用、前瞻，体现人力资源专家的思维方式和表达习惯，注重数据和实证支持。始终关注人才发展和组织成功的平衡，并在实用性和前瞻性之间找到合适的平衡点。`
}

export class ChatService {
  private static readonly DEEPSEEK_API_KEY = 'sk-1c45e134877d4dc6ba2482dccc1f462a'
  private static readonly DEEPSEEK_BASE_URL = 'https://api.deepseek.com'
  private static readonly BAIDU_ACCESS_TOKEN = 'your_baidu_access_token_here' // 添加百度访问令牌

  static async analyzeImage(base64Image: string): Promise<string> {
    try {
      // 移除base64前缀
      const imageData = base64Image.replace(/^data:image\/(png|jpeg|jpg);base64,/, '')

      const response = await axios.post(
        `https://aip.baidubce.com/rest/2.0/image-classify/v2/advanced_general?access_token=${this.BAIDU_ACCESS_TOKEN}`,
        {
          image: imageData
        },
        {
          headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
          }
        }
      )

      if (response.data.result && response.data.result.length > 0) {
        const descriptions = response.data.result.map((item: any) =>
          `${item.keyword}(可能性：${Math.floor(item.score * 100)}%)`
        ).join('、')
        return `这张图片可能包含：${descriptions}`
      }

      return '抱歉，我无法识别这张图片的内容。'
    } catch (error) {
      console.error('图像识别错误:', error)
      return '图像识别服务出现错误，请稍后重试。'
    }
  }

  static async processFile(file: File): Promise<FileAttachment | null> {
    return new Promise((resolve) => {
      const reader = new FileReader();

      reader.onload = (event) => {
        if (!event.target || !event.target.result) {
          resolve(null);
          return;
        }

        const content = event.target.result.toString();
        const fileType = file.type;

        let type: 'image' | 'document' | 'text';

        if (fileType.startsWith('image/')) {
          type = 'image';
          // 确保图片内容是base64格式
          console.log('图片内容前缀:', content.substring(0, 50));
        } else if (fileType === 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' ||
                  fileType === 'application/msword') {
          type = 'document';
        } else if (fileType === 'text/plain' || file.name.endsWith('.txt')) {
          type = 'text';
        } else {
          resolve(null);
          return;
        }

        resolve({
          type,
          name: file.name,
          content,
          mimeType: fileType
        });
      };

      reader.onerror = () => {
        resolve(null);
      };

      reader.readAsDataURL(file);
    });
  }

  static async sendMessageToLegalAdvisor(messages: ChatMessage[], fileAttachment?: FileAttachment): Promise<ChatResponse> {
    try {
      // 检查是否已经有系统提示词
      let hasSystemPrompt = messages.some(msg => msg.role === 'system');

      // 处理之前的消息，确保格式一致
      let processedMessages = messages.map(msg => {
        // 如果不是最后一条消息，确保内容是字符串
        return {
          role: msg.role,
          content: typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content)
        };
      });

      // 如果没有系统提示词，添加一个
      if (!hasSystemPrompt) {
        processedMessages = [
          { role: 'system', content: SYSTEM_PROMPTS[ModelType.LEGAL] },
          ...processedMessages
        ];
      }

      // 获取最后一条用户消息
      const lastUserMessage = processedMessages[processedMessages.length - 1];

      // 如果有文件附件，添加到消息中
      if (fileAttachment) {
        if (fileAttachment.type === 'image') {
          // 对于图片，使用正确的vision模型格式
          console.log('处理图片附件:', fileAttachment.name);

          // 创建一个新的消息，包含文本和图片
          const multimodalMessage = {
            role: "user" as const,
            content: [
              {
                type: "text",
                text: lastUserMessage.content
              },
              {
                type: "image_url",
                image_url: {
                  url: fileAttachment.content
                }
              }
            ]
          };

          // 替换最后一条消息
          processedMessages[processedMessages.length - 1] = multimodalMessage as any;

          console.log('多模态消息已创建:', JSON.stringify(multimodalMessage, null, 2));
        } else if (fileAttachment.type === 'text') {
          // 对于文本文件，添加文件内容
          console.log('处理文本附件:', fileAttachment.name);
          const textContent = fileAttachment.content.startsWith('data:')
            ? atob(fileAttachment.content.split(',')[1])
            : fileAttachment.content;

          lastUserMessage.content = `${lastUserMessage.content}\n\n文件 ${fileAttachment.name} 的内容：\n${textContent}`;
        } else if (fileAttachment.type === 'document') {
          // 对于Word文档，添加提示
          console.log('处理文档附件:', fileAttachment.name);
          lastUserMessage.content = `${lastUserMessage.content}\n\n我上传了一个Word文档：${fileAttachment.name}，请帮我分析其中的内容。`;
        }
      }

      console.log('发送到Kimi的消息数量:', processedMessages.length);

      // 检查消息格式
      processedMessages.forEach((msg, index) => {
        console.log(`消息 ${index} 角色:`, msg.role);
        if (Array.isArray(msg.content)) {
          console.log(`消息 ${index} 是多模态内容，包含 ${msg.content.length} 个元素`);
        } else {
          console.log(`消息 ${index} 是文本内容，长度: ${(msg.content as string).length}`);
        }
      });

      const requestBody = {
        model: 'deepseek-chat',
        messages: processedMessages,
        temperature: 0.7
      };

      console.log('请求体结构:', JSON.stringify({
        model: requestBody.model,
        messagesCount: requestBody.messages.length,
        temperature: requestBody.temperature
      }));

      const response = await axios.post(
        `${this.DEEPSEEK_BASE_URL}/v1/chat/completions`,
        requestBody,
        {
          headers: {
            'Content-Type': 'application/json',
            'Authorization': `Bearer ${this.DEEPSEEK_API_KEY}`
          }
        }
      );

      console.log('DeepSeek API响应状态:', response.status);

      return {
        content: response.data.choices[0].message.content
      }
    } catch (error) {
      console.error('DeepSeek API调用错误:', error);

      if (axios.isAxiosError(error)) {
        console.error('请求配置:', JSON.stringify({
          url: error.config?.url,
          method: error.config?.method,
          headers: error.config?.headers
        }));

        if (error.response) {
          console.error('响应状态:', error.response.status);
          console.error('响应数据:', JSON.stringify(error.response.data));

          let errorMessage = '服务器返回错误';
          try {
            if (typeof error.response.data === 'object' && error.response.data.error) {
              errorMessage = error.response.data.error.message || errorMessage;
            }
          } catch (e) {
            console.error('解析错误信息失败:', e);
          }

          return {
            content: `抱歉，${errorMessage}`,
            error: errorMessage
          };
        } else if (error.request) {
          console.error('请求已发送但没有收到响应');
          return {
            content: '抱歉，服务器没有响应，请检查网络连接。',
            error: '请求超时或网络问题'
          };
        }
      }

      return {
        content: '抱歉，发送图片时出现错误，请稍后再试。',
        error: error instanceof Error ? error.message : '未知错误'
      }
    }
  }

  static async sendMessageToHRAdvisor(message: string, fileAttachment?: FileAttachment): Promise<ChatResponse> {
    try {
      let processedMessage = message;

      // 如果有文件附件，添加到消息中
      if (fileAttachment) {
        if (fileAttachment.type === 'image') {
          // 对于图片，使用图像识别API
          const imageAnalysis = await this.analyzeImage(fileAttachment.content);
          processedMessage = `${processedMessage}\n\n${imageAnalysis}`;
        } else if (fileAttachment.type === 'text') {
          // 对于文本文件，添加文件内容
          const textContent = fileAttachment.content.startsWith('data:')
            ? atob(fileAttachment.content.split(',')[1])
            : fileAttachment.content;

          processedMessage = `${processedMessage}\n\n文件 ${fileAttachment.name} 的内容：\n${textContent}`;
        } else if (fileAttachment.type === 'document') {
          // 对于Word文档，添加提示
          processedMessage = `${processedMessage}\n\n我上传了一个Word文档：${fileAttachment.name}，请帮我分析其中的内容。`;
        }
      }

      // 构建消息数组，包含系统提示词和用户消息
      const messages = [
        { role: 'system', content: SYSTEM_PROMPTS[ModelType.HR] },
        { role: 'user', content: processedMessage }
      ];

      const response = await axios.post(
        `${this.DEEPSEEK_BASE_URL}/v1/chat/completions`,
        {
          model: 'deepseek-chat',
          messages: messages,
          temperature: 0.7
        },
        {
          headers: {
            'Content-Type': 'application/json',
            'Authorization': `Bearer ${this.DEEPSEEK_API_KEY}`
          }
        }
      )

      return {
        content: response.data.choices[0].message.content
      }
    } catch (error) {
      console.error('DeepSeek API调用错误:', error)

      if (axios.isAxiosError(error)) {
        console.error('请求配置:', JSON.stringify({
          url: error.config?.url,
          method: error.config?.method,
          headers: error.config?.headers
        }));

        if (error.response) {
          console.error('响应状态:', error.response.status);
          console.error('响应数据:', JSON.stringify(error.response.data));

          let errorMessage = '服务器返回错误';
          try {
            if (typeof error.response.data === 'object' && error.response.data.error) {
              errorMessage = error.response.data.error.message || errorMessage;
            }
          } catch (e) {
            console.error('解析错误信息失败:', e);
          }

          return {
            content: `抱歉，${errorMessage}`,
            error: errorMessage
          };
        } else if (error.request) {
          console.error('请求已发送但没有收到响应');
          return {
            content: '抱歉，服务器没有响应，请检查网络连接。',
            error: '请求超时或网络问题'
          };
        }
      }

      return {
        content: '抱歉，服务器出现错误，请稍后再试。',
        error: error instanceof Error ? error.message : '未知错误'
      }
    }
  }

  static async sendMessage(
    modelType: ModelType,
    messages: ChatMessage[],
    lastMessage: string,
    fileAttachment?: FileAttachment
  ): Promise<ChatResponse> {
    if (modelType === ModelType.LEGAL) {
      return this.sendMessageToLegalAdvisor(messages, fileAttachment);
    } else {
      return this.sendMessageToHRAdvisor(lastMessage, fileAttachment);
    }
  }
}